package cz.vse.adventura.po1715.xburj54_bursa.gui;

import java.awt.Dimension;
import javax.swing.JEditorPane;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.text.Document;

/*******************************************************************************
 * Instance třídy {@code ActivityLogWindow} představují výstupní okno,
 *      kam se zaznamenává průběh hry
 *
 * @author    Jan Bursa
 * @version   1.01
 */
public class ActivityLogWindow {
    
//== KONSTANTNÍ ATRIBUTY TŘÍDY =================================================
//== PROMĚNNÉ ATRIBUTY TŘÍDY ===================================================
//== STATICKÝ INICIALIZAČNÍ BLOK - STATICKÝ KONSTRUKTOR ========================
//== KONSTANTNÍ ATRIBUTY INSTANCÍ ==============================================
    
           
    /** Okno */
    private final JFrame logWindow;
    
    /*Výstupní oblast, do které se zapisuje*/
    private final JEditorPane outputArea;
    
    /** Scroller pro okno */
    private final JScrollPane scroller;
        
    /** SB na připojování*/
    private final StringBuilder stringBuilder;
    
//== PROMĚNNÉ ATRIBUTY INSTANCÍ ================================================
//== PŘÍSTUPOVÉ METODY VLASTNOSTÍ TŘÍDY ========================================
//== OSTATNÍ NESOUKROMÉ METODY TŘÍDY ===========================================

//##############################################################################
//== KONSTRUKTORY A TOVÁRNÍ METODY =============================================
    /***************************************************************************
     *@param size - rozměr okna logu
     */

    public ActivityLogWindow(Dimension size) {
        logWindow = new JFrame("Záznam hry");
        logWindow.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
        
        outputArea = new JEditorPane ("text/html","");
        outputArea.setEditable(false);
        outputArea.setSize(size);
        scroller = new JScrollPane();
        
        stringBuilder = new StringBuilder();
        initialize();
        
        scroller.setViewportView(outputArea);
        scroller.setPreferredSize(size);
        logWindow.add(scroller);
        logWindow.pack();
    }
//== ABSTRAKTNÍ METODY =========================================================
//== PŘÍSTUPOVÉ METODY VLASTNOSTÍ INSTANCÍ =====================================
    
    /***************************************************************************
     * Zjistí viditelnost okna
     */
    Boolean isVisible() {
        return logWindow.isVisible();
    }
    
    /***************************************************************************
     * Nastaví viditelnost okna
     * @param visible - true, když má být viditelné
     */
    void setVisible(Boolean visible) {
        logWindow.setVisible(visible);
    }
    
//== OSTATNÍ NESOUKROMÉ METODY INSTANCÍ ========================================
    
    
    
    /***************************************************************************
     * Připojí řádek záznamu na konec výstupního okna
     * 
     * @param line - řádek, který se připojí
     */
    void update(String line) {
        stringBuilder.append(line);
        String outputText = (stringBuilder.toString() + "</html>").replaceAll("\n", "<br>");
        outputArea.setText(outputText);
        Document document = outputArea.getDocument();
        int position = document.getLength();
        outputArea.setCaretPosition(position);        
    }
    
//== SOUKROMÉ A POMOCNÉ METODY TŘÍDY ===========================================
//== SOUKROMÉ A POMOCNÉ METODY INSTANCÍ ========================================
    
    /***************************************************************************
     * Inicializuje oblast s vystupujícím textem.
     * Zde je potřeba při každém spuštění hry smazat
     * případný dříve vypsaný text, aby hra začala s čistou oblastí.
     */
    private void initialize() {
        stringBuilder.setLength(0);
        stringBuilder.append("<html>");
    }
    
//== INTERNÍ DATOVÉ TYPY =======================================================
//== TESTY A METODA MAIN =======================================================
//
//    /***************************************************************************
//     * Testovací metoda.
//     */
//    public static void test()
//    {
//        ActivityLogWindow inst = new ActivityLogWindow();
//    }
//    public static void main( String[] args )  {  test();  }
}
